/**
 * 通用请求工具
 * 封装uni.request，统一处理请求、响应和错误
 */

// 基础配置
const BASE_URL = process.env.NODE_ENV === 'development' 
  ? 'http://localhost:3000' 
  : 'https://api.cherry-mall.com';

// 请求超时时间
const TIMEOUT = 30000;

/**
 * 请求函数
 * @param {Object} options - 请求配置
 * @param {string} options.url - 请求地址
 * @param {string} options.method - 请求方法
 * @param {Object} options.data - 请求数据
 * @param {Object} options.header - 请求头
 * @param {boolean} options.loading - 是否显示加载提示
 * @param {string} options.loadingText - 加载提示文字
 * @returns {Promise} - 返回Promise对象
 */
const request = (options = {}) => {
  // 处理请求选项
  const {
    url,
    method = 'GET',
    data = {},
    header = {},
    loading = false,
    loadingText = '加载中...',
  } = options;
  
  // 完整URL
  const requestUrl = /^(http|https):\/\//.test(url) ? url : BASE_URL + url;
  
  // 合并请求头
  const requestHeader = {
    'Content-Type': 'application/json',
    ...header
  };
  
  // 获取token，如果存在则添加到请求头
  const token = uni.getStorageSync('token');
  if (token) {
    requestHeader.Authorization = `Bearer ${token}`;
  }
  
  // 显示加载提示
  if (loading) {
    uni.showLoading({
      title: loadingText,
      mask: true
    });
  }
  
  // 返回Promise
  return new Promise((resolve, reject) => {
    // 请求计时器
    const timer = setTimeout(() => {
      uni.hideLoading();
      reject(new Error('请求超时'));
    }, TIMEOUT);
    
    // 发起请求
    uni.request({
      url: requestUrl,
      method,
      data,
      header: requestHeader,
      success: (res) => {
        clearTimeout(timer);
        if (loading) {
          uni.hideLoading();
        }
        
        // 请求成功，但响应可能有错误
        if (res.statusCode >= 200 && res.statusCode < 300) {
          // 假设后端返回格式: { code: 0, data: {}, message: '' }
          // code为0表示业务处理成功
          if (res.data.code === 0) {
            resolve(res.data.data);
          } else {
            // 业务处理失败，显示错误信息
            uni.showToast({
              title: res.data.message || '请求失败',
              icon: 'none'
            });
            reject(res.data);
          }
        } else {
          // HTTP请求失败
          handleHttpError(res.statusCode);
          reject(res);
        }
      },
      fail: (err) => {
        clearTimeout(timer);
        if (loading) {
          uni.hideLoading();
        }
        
        // 网络错误等
        uni.showToast({
          title: '网络异常，请检查网络连接',
          icon: 'none'
        });
        reject(err);
      }
    });
  });
  
  /**
   * 处理HTTP错误
   * @param {number} statusCode - HTTP状态码
   */
  function handleHttpError(statusCode) {
    let message = '';
    
    switch(statusCode) {
      case 401:
        message = '未授权，请登录';
        // 可以在这里处理登录过期，跳转到登录页
        uni.navigateTo({
          url: '/pages/login/index'
        });
        break;
      case 403:
        message = '拒绝访问';
        break;
      case 404:
        message = '请求的资源不存在';
        break;
      case 500:
        message = '服务器错误';
        break;
      default:
        message = `请求失败(${statusCode})`;
    }
    
    uni.showToast({
      title: message,
      icon: 'none'
    });
  }
};

// 导出请求方法
export default request;

// 简化的请求方法，方便使用
export const get = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'GET',
    data,
    ...options
  });
};

export const post = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'POST',
    data,
    ...options
  });
};

export const put = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'PUT',
    data,
    ...options
  });
};

export const del = (url, data = {}, options = {}) => {
  return request({
    url,
    method: 'DELETE',
    data,
    ...options
  });
}; 